Jag listar över kontakter från webbtjänsten och visar den i kontakternas "sektionerade" tabellvy som visas på skärmdumpen. Problemet är att jag får samma taggvärden för kryssrutorna i första raden för avsnitt A såväl som avsnitt S. Jag har sorterat en array och visas i den indexerade tabellvyn. Hur man får olika taggvärden beroende på indexPath.row oavsett antal sektioner som visas. Här är vad jag försökte I cellForRowAtIndexPath: UIButton * checkBox; om (UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiomPhone) { checkBox = [[UIButton alloc] initWithFrame: CGRectMake (7, 8, 30, 30)]; } annan { checkBox = [[UIButton alloc] initWithFrame: CGRectMake (15, 13, 30, 30)]; } // int cnt = 0; // för (int i = indexPath.section - 1; i> 0; i--) // { // cnt + = [[objectsForCharacters objectForKey: [arrayOfCharacters objectAtIndex: i]] count]; // arrayOfCharachters har "A" till "Z" //} //checkBox.tag = cnt + indexPath.row; [checkBox setImage: [UIImage imageNamed: @ "checkBox.png"] forState: UIControlStateNormal]; [checkBox addTarget: self action: @selector (checkBoxClicked :) forControlEvents: UIControlEventTouchUpInside]; [checkBox setTag: indexPath.row]; [cell.contentView addSubview: checkBox]; returcell; } - (ogiltigt) checkBoxClicked: (id) avsändare { CGPoint buttonPosition = [avsändare convertPoint: CGPointZero toView: self.tableViewContact]; NSIndexPath * indexPath = [self.tableViewContact indexPathForRowAtPoint: buttonPosition]; UIButton * tappedButton = (UIButton *) avsändare; NSLog (@ "Taggnummer =% d", [avsändarkod]); if ([tappedButton.currentImage isEqual: [UIImage imageNamed: @ "checkBox.png"]]) { [sender setImage: [UIImage imageNamed: @ "checkBoxMarked.png"] forState: UIControlStateNormal]; if (indexPath! = Nil) { NSString * finalIntId = [mutableArrayOfIds objectAtIndex: indexPath.row]; // lagra kryssrutan id i mutableArrayOfIds NSLog (@ "Taggad markerad knapp id =% @", finalIntId); [arrayOfIds addObject: finalIntId]; } // NSString * finalIntId = [mutableArrayOfIds objectAtIndex: tappedButton.tag]; // NSString * finalIntId = [mutableArrayOfIds objectAtIndex: indexPath.row]; } annan { [sender setImage: [UIImage imageNamed: @ "checkBox.png"] forState: UIControlStateNormal]; NSLog (@ "Okontrollerad"); // [arrayOfIds removeObjectAtIndex: tappedButton.tag]; } } - (NSString *) tableView: (UITableView *) tableView titleForHeaderInSection: (NSInteger) avsnitt { if ([arrayOfCharacters count] == 0) { lämna tillbaka @""; } returnera [NSString stringWithFormat: @ "% @", [arrayOfCharacters objectAtIndex: avsnitt]]; } - (NSArray *) avsnittIndexTitlesForTableView: (UITableView *) tableView { NSArray * toBeReturned = [NSArray arrayWithArray: [@ "A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | # " componentsSeparatedByString: @ "|"]]; återgå till BeReturned; } - (NSInteger) tableView: (UITableView *) tableView sectionForSectionIndexTitle: (NSString *) title atIndex: (NSInteger) index { NSInteger count = 0; för (NSString * karaktär i arrayOfCharacters) { om ([karaktär isEqualToString: titel]) { returräkning; } räkna ++; } returnera 0; } - (NSInteger) numberOfSectionsInTableView: (UITableView *) tableView { returnera [arrayOfCharacters count]; // return 1; } - (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: (NSInteger) avsnitt { // returnera [mutableArray count]; return [[objectsForCharacters objectForKey: [arrayOfCharacters objectAtIndex: section]] count]; }
2020-12-07 22:55:26
du ställer in samma taggvärde för alla sektioner som har samma rad. IndexPath har två egenskaper, {sektion, rad}. Låt oss säga att avsnitt A har två rader, för rad1 -> indexPath.section = 0, indexPath.row = 0; för rad2-> indexPath.section = 0, indexPath.row = 1; Låt oss säga att avsnitt S har två rader, för rad1 -> indexPath.section = 1, indexPath.row = 0; för rad2-> indexPath.section = 1, indexPath.row = 1; Så för rad 1 i avsnitt A och rad 1 i avsnitt S ställer du in samma taggvärde som är 0. Det är ditt problem. Prova att ställa in taggvärde som nedan. button.tag = indexPath.section * 1000 + indexPath.row; när du hämtar sektionen och raden, NSInteger sektion = (button.tag) / 1000; NSInteger row = (button.tag)% 1000; | Prova detta... - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath { statisk NSString * CellIdentifier = @ "Cell"; UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier]; om (cell == noll) { cell = [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault reuseIdentifier: CellIdentifier]; } UIButton * checkBox = [[UIButton alloc] initWithFrame: CGRectMake (280, 10, 50, 44)]; checkBox.backgroundColor = [UIColor orangeColor]; [checkBox addTarget: self action: @selector (checkBoxClicked: event:) forControlEvents: UIControlEventTouchUpInside]; [checkBox setTag: indexPath.row]; [cell.contentView addSubview: checkBox]; returcell; } - (ogiltigt) checkBoxClicked: (id) avsändarhändelse: (id) händelse { NSSet * touches = [event allTouches]; UITouch * touch = [berör anyObject]; CGPoint currentTouchPosition = [peka locationInView: self.tv]; // här är tv TableView-objekt NSIndexPath * indexPath = [self.tv indexPathForRowAtPoint: currentTouchPosition]; NSLog (@ "värde för indePath.section% d, indexPath.row% d", indexPath.section, indexPath.row); } | Detta händer eftersom du tilldelar tagg till knappar OBEROENDE av sektioner. Båda första raderna i sektioner A och S har rad = 0. så Tagg tilldelad till respektive knapp är 0. Du bör tilldela dem Håll referens till dina avsnitt. Jag skulle föreslå att tilldela tillgänglighetstips med kommaseparerad form som innehåller avsnitt, rad. Och i din metod - (ogiltigt) checkBoxClicked: (id) avsändare { // välj sträng från kommaseparerad form. 1: a är din sektion, 2: a är rad. } andra alternativet är vad du än gör och implementera din knappmetod så här. CGPoint buttonPosition = [avsändare convertPoint: CGPointZero toView: self.tableView]; NSIndexPath * indexPath = [self.tableView indexPathForRowAtPoint: buttonPosition]; om (indexPath! = noll) { ... indexpath.section är ditt avsnitt, index path.row är din rad. } Det finns också det tredje alternativet. i cellforRowAtIndexpath tilldela din knapp en titel - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath [btn setTitle: <# Your Row #> forState: UIControlStateDisabled]; [btn setTag <#Ditt avsnitt #>]; så vid mottagning i din knappmetod kan du ha både avsnitt (tagg) och rad (titel för inaktiverat tillstånd). - (ogiltig) checkBoxClicked: (id) avsändare {[knapptitelForState: UIControlStateDisabled]; // din rad button.tag // ditt avsnitt} | Prova detta! Varje sektion kanske du känner till antalet av sektioner till höger och lägg sedan till antalet individuella rader. [[fieldTitlesList objectAtIndex: indexPath.section - 1] count] + indexPath.row Där fieldTitlesList är matrisen för dina sektioner. | Jag lade till följande kod som löste mitt problem NSInteger rowNumber = 0; för (NSInteger i = 0; i